package com.udima.reglocation;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.udima.reglocation.entities.UserSession;
import com.udima.reglocation.util.AsyncTaskCompleteListener;
import com.udima.reglocation.util.HttpAsyncTask;
import com.udima.reglocation.util.LogHelper;
import com.udima.reglocation.util.PreferencesHandler;
import com.udima.reglocation.util.UserSessionHandler;

/**
 * Clase inicial de la aplicación
 * 
 * Muestra el logotipo de la aplicación y realiza comprobaciones de conectividad y login previo
 * 
 * @author luis
 * 
 */

public class MainSplashScreenActivity extends Activity implements AsyncTaskCompleteListener {

	private TextView lblGotoServerConfig;
	private Button btnReconnect;
	private TextView lblActualServer;

	@Override
	/**
	 * 
	 * Método que se ejecuta tras la creación de la actividad
	 * 
	 * Se realizan dos comprobaciones:
	 * -Si existe conectividad a través de la URL del servidor que actualmente está configurada
	 * -Si existe login válido activo previo del usuario que accede
	 * En caso de no exitir conectividad el control se mantiene en esta pantalla y se activan los controles de configuración.
	 *    Si existe conectividad, se valida la sesion del usuario y si está activa se redirige el control hacia el menú principal.
	 *    En caso contrario el control es redirigido a la pantanlla de login/registro
	 *    
	 * @param savedInstanceState Contiene la información previa de la actividad en caso de que se vuelva a recrear
	 * 
	 */
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main_splash_screen_activity);
		
		PreferencesHandler ph = new PreferencesHandler(getApplicationContext());
		lblActualServer = (TextView) findViewById(R.id.lbl_actual_server);
		lblActualServer.setText("Servidor actual\n" + ph.retrieveAppBaseUrl());

		// configuración del boton de reconexión
		btnReconnect = (Button) findViewById(R.id.btnReconnect);
		btnReconnect.setOnClickListener(new View.OnClickListener() {
			public void onClick(View view) {
				redirectOnUserSession();
			}
		});

		// configuración del link de configuración del servidor
		lblGotoServerConfig = (TextView) findViewById(R.id.link_to_config_server);
		lblGotoServerConfig.setOnClickListener(new View.OnClickListener() {
			public void onClick(View view) {
				Intent i = new Intent(getBaseContext(), PreferencesActivity.class);
				startActivity(i);
			}
		});

		// Creación de un hilo que "duerme" durante n segundos
		Thread background = new Thread() {
			public void run() {
				try {
					// Tiempo que se mantiene el hilo "dormido"
					sleep(1 * 1000);
				} catch (Exception e) {
					Toast.makeText(getBaseContext(), "Error grave!! Revise el log de la aplicación", Toast.LENGTH_LONG).show();
					LogHelper.logError("Error sleeping thread", e);
				}
			}
		};
		background.start();

		redirectOnUserSession();
	}

	@Override
	/**
	 * Destructor de la clase
	 */
	protected void onDestroy() {
		super.onDestroy();
	}

	@Override
	/**
	 * Declaracion del interfaz que se invoca tras la consulta http asíncrona
	 * 
	 * @param result Cadena con el resultado de la consulta
	 */
	public void onTaskComplete(String result) {

	}
	
	@Override
	/**
	 * 
	 * Metodo que se ejecuta cuando se retoma la actividad de la clase
	 * 
	 */
	public void onResume() {
		super.onResume();
		
		PreferencesHandler ph = new PreferencesHandler(getApplicationContext());
		lblActualServer = (TextView) findViewById(R.id.lbl_actual_server);
		lblActualServer.setText("Servidor actual\n" + ph.retrieveAppBaseUrl());
	}

	/**
	 * 
	 * Método que redirecciona al usuario en base a la existencia o no de un login previo
	 * 
	 */
	private void redirectOnUserSession() {

		// comprobamos si el usuario ya estaba conectado y su sesion no ha
		// expirado
		UserSessionHandler ush = new UserSessionHandler(getApplicationContext());
		UserSession us = ush.retrieveUserSession();

		if (us == null) {
			Intent i = new Intent(getBaseContext(), LoginActivity.class);
			startActivity(i);
		} else {

			PreferencesHandler ph = new PreferencesHandler(getApplicationContext());
			String appBaseUrl = ph.retrieveAppBaseUrl();

			JSONObject jsonReq = new JSONObject();
			JSONObject jsonUserSession = new JSONObject();
			try {
				jsonUserSession.put("userId", us.getUserId());
				jsonUserSession.put("sessionToken", us.getSessionToken());
				jsonReq.put("userSession", jsonUserSession);
			} catch (JSONException e) {
				Toast.makeText(getBaseContext(), "Error grave!! Revise el log de la aplicación", Toast.LENGTH_LONG).show();
				LogHelper.logError("Error parsing json result", e);
			}

			// Definición del callback particular para la validación de sesión
			final AsyncTaskCompleteListener callback = new AsyncTaskCompleteListener() {

				@Override
				public void onTaskComplete(String result) {

					if (HttpAsyncTask.CONNECTIONERROR.equals(result)) {
						Toast.makeText(getBaseContext(), "Error conectando con el servidor", Toast.LENGTH_LONG).show();
					} else {
						// Primero se transforma el resultado a un objeto Json
						try {
							JSONObject json = new JSONObject(result);
							if (json.getString("responseSuccessful") == "true") {
								Intent i = new Intent(getBaseContext(), TrackMenuActivity.class);
								startActivity(i);
							} else {
								Intent i = new Intent(getBaseContext(), LoginActivity.class);
								startActivity(i);
							}

						} catch (JSONException e) {
							Toast.makeText(getBaseContext(), "Error grave!! Revise el log de la aplicación", Toast.LENGTH_LONG).show();
							LogHelper.logError("Error parsing json result", e);
						}
					}
				}
			};

			// Ejecución de la consulta al servicio rest de validación de sesión
			new HttpAsyncTask(this) {
				@Override
				protected void onPostExecute(String result) {
					super.onPostExecute(result);
					callback.onTaskComplete(result);
				}
			}.execute(appBaseUrl + "/rest/users/validateSession", jsonReq.toString());

		}
	}

}